import turtle
import math

# 设置国旗的尺寸（标准比例3:2）。
# 旗长用288的倍数（参考大小：288 x 192）
flag_length = 288 * 3
# 旗高用旗长计算，方便调整大小
flag_height = flag_length * 2 // 3

# 设置画布
screen = turtle.getscreen()
screen.title("红旗")
screen.setup(flag_length + 100, flag_height + 100)

# 设置画笔
pen = turtle.getpen()
pen.shape("turtle")
pen.speed(0) # 速度：0是最快、10是较快、6是正常、3是较慢、1是最慢

### 画红旗 开始 ###
pen.teleport(-flag_length/2, flag_height/2)
pen.color("#F40002")
pen.begin_fill()
for _ in range(2):
    pen.forward(flag_length)
    pen.right(90)
    pen.forward(flag_height)
    pen.right(90)
pen.end_fill()
### 画红旗 结束 ###

# 步长
step_length = flag_length / 2 / 15
# step_height = flag_height / 2 / 10

# 大五角星的外接圆半径（外接圆直径为旗高3/10）
radius_big = flag_height * 3 / 10 / 2
# 小五角星的外接圆半径（外接圆直径为旗高1/10）
radius_small = flag_height * 1 / 10 / 2

# 将圆心坐标与半径存储到一个列表中
circles = [(0 - step_length * 10, step_length * 5, radius_big), 
           (0 - step_length * 5, step_length * 8, radius_small), 
           (0 - step_length * 3, step_length * 6, radius_small), 
           (0 - step_length * 3, step_length * 3, radius_small), 
           (0 - step_length * 5, step_length * 1, radius_small)]

# 大圆心
x0, y0, r0 = circles[0]

# 计算两点的角度
def calculate_angle(x1, y1, x2, y2):
    """计算点(x1, y1)到点(x2, y2)的角度（其连线与x轴的夹角）"""
    # 计算水平和垂直差异
    dx = x2 - x1; dy = y2 - y1

    # x 相等时直接返回 90
    if dx == 0: return 90

    # 使用arctan函数计算角度，将弧度转换为角度
    return math.degrees(math.atan2(dy, dx))

# 画五角星函数
def draw_star(x = 0, y = 0, radius = 100, heading_angle = 90, color = "#FAF408"):

    pen.color(color)
    # pen.pencolor(color)
    # pen.fillcolor(color)

    # 调整方向
    pen.setheading(heading_angle) 

    # 根据半径计算边长
    side = radius * math.sin(math.radians(72)) / (1 + math.sin(math.radians(18)))

    pen.penup() # 提起笔
    pen.goto(x, y) # 到圆心
    pen.forward(radius) # 到圆边
    pen.right(180 - 18) # 掉头后便转18度
    # pen.pendown() # 不放下笔时不画边框，但会填充

    ## 开始画五角星
    pen.begin_fill() # 开始填充
    for _ in range(5):
        pen.forward(side)
        pen.left(72)
        pen.forward(side)
        pen.right(144)
    pen.end_fill() # 结束填充
    ## 结束画五角星

# 画五角星
for x, y, r in circles:
    draw_star(x, y, r, calculate_angle(x, y, x0, y0))

# 收笔
pen.hideturtle()
# 持续显示
screen.mainloop()